
package GestorClinico;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
 
/**
 * @file Estadisticas.java
 * @brief Implementa la clase Estadisticas
 *
 * Genera el conjuto de datos necesarios para graficar.
 *
 * @author José Ángel Carvajal Soto
 * @version 1.0
 *
 */

public class Estadisticas {
    

    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso y realiza el proceso de creación del conjunto de datos para la gráfica de citas
     * agrupadas según el día de la semana en un mes.
     * @param mes el cuas será usado como referencia para la estadistica.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de barras.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static  CategoryDataset citaDia(Integer mes) throws SQLException, IOException, ClassNotFoundException {

            ArrayList<ArrayList<String>> res =  EstadisticasDAO.getCitasDia(mes);
            DefaultCategoryDataset dataset=null;

            if(res.size()>0){
                dataset = new DefaultCategoryDataset();

                dataset.addValue(0.0, "Semana", "Lunes");
                dataset.addValue(0.0, "Semana", "Martes");
                dataset.addValue(0.0, "Semana", "Miercoles");
                dataset.addValue(0.0, "Semana", "Jueves");
                dataset.addValue(0.0, "Semana", "Viernes");
                dataset.addValue(0.0, "Fin de semana", "Sabado");
                dataset.addValue(0.0, "Fin de semana", "Domingo");

                for (ArrayList<String> i : res){
                    if (i.get(0).equals("Monday"))
                        dataset.addValue(Integer.parseInt(i.get(1)), "Semana", "Lunes");
                    else if (i.get(0).equals("Tuesday"))
                        dataset.addValue(Integer.parseInt(i.get(1)), "Semana", "Martes");
                    else if (i.get(0).equals("Wednesday"))
                        dataset.addValue(Integer.parseInt(i.get(1)), "Semana", "Miercoles");
                    else if (i.get(0).equals("Thursday"))
                        dataset.addValue(Integer.parseInt(i.get(1)), "Semana", "Jueves");
                    else if (i.get(0).equals("Friday"))
                        dataset.addValue(Integer.parseInt(i.get(1)), "Semana", "Viernes");
                    else if (i.get(0).equals("Saturday"))
                        dataset.addValue(Integer.parseInt(i.get(1)), "Fin de semana", "Sabado");
                    else
                        dataset.addValue(Integer.parseInt(i.get(1)), "Fin de semana", "Domingo");
                }

        }
            return dataset;

        }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica de pacientes según su edad.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de barras.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static  CategoryDataset pacientesEdad() throws SQLException, IOException, ClassNotFoundException {

           return crearDataSet(EstadisticasDAO.getPacienteEdad(),"Edad");

        }
    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica de empleados según su edad.
     * @param mes el cuas será usado como referencia para la estadistica.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static DefaultPieDataset empledosTipo() throws SQLException, IOException, ClassNotFoundException{
        return  createDataSetPie(EstadisticasDAO.getEmpleadosTipo(),false);
    }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica de la distribucion
     * de generos de los pacientes.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
     public static DefaultPieDataset generos() throws SQLException, IOException, ClassNotFoundException{
        return createDataSetPie(EstadisticasDAO.getGeneros(),true);
    }

     /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica de la distribucion
     * de pruebas según su tipo.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
     public static DefaultPieDataset prubasTipo() throws SQLException, IOException, ClassNotFoundException{
        return createDataSetPie(EstadisticasDAO.getPruebas(),true);
    }

     /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica de la distribucion de citas según la edad.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
      public static DefaultPieDataset citaEdad() throws SQLException, IOException, ClassNotFoundException{
        return createDataSetPie(EstadisticasDAO.getCitasEdad(),true);
    }

      /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n medicos con más
     * citas en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
      public static CategoryDataset citaMedico(Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return crearDataSet(EstadisticasDAO.getMedicoCita(inicio,fin,tamanio),"Citas");
    }

      /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n pacientes con más
     * citas en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static CategoryDataset PacienteMedico(Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return crearDataSet(EstadisticasDAO.getPacienteCita(inicio,fin, tamanio),"Citas");
    }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n farmacos más
     * comprados en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static CategoryDataset lote(Date inicio, Date fin,Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return crearDataSet(EstadisticasDAO.getLote(inicio,fin, tamanio),"Lotes");
    }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n farmacos más
     * recetados en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static CategoryDataset farmacoMasVendido(Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return crearDataSet(EstadisticasDAO.getFarmacoMasPedido(inicio, fin, tamanio),"Paquetes");
    }

   /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n medicos con más
     * citas en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static ArrayList<ArrayList<String>>  ListadoCitaMedico(Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return EstadisticasDAO.getMedicoCita(inicio,fin,tamanio);
    }

      /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n pacientes con más
     * citas en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static ArrayList<ArrayList<String>>  ListadoPacienteMedico(Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return EstadisticasDAO.getPacienteCita(inicio,fin, tamanio);
    }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n farmacos más
     * comprados en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static ArrayList<ArrayList<String>>  ListadoLote(Date inicio, Date fin,Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return EstadisticasDAO.getLote(inicio,fin, tamanio);
    }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Controla el proceso de creación del conjunto de datos para la gráfica que muestra los n farmacos más
     * recetados en un periodo.
     * @param inicio indica el inicio del periodo de busqueda.
     * @param fin indica el fin del periodo de busqueda.
     * @param tamanio del conjuto de datos.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     * @throws SQLException
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public static ArrayList<ArrayList<String>>  ListadoFarmacoMasVendido(Date inicio, Date fin, Integer tamanio) throws SQLException, IOException, ClassNotFoundException{
        return EstadisticasDAO.getFarmacoMasPedido(inicio, fin, tamanio);
    }

 /**
     * @author José Ángel Carvajal Soto
     * @brief Crea un conjunto de datos para una gráfica de barras.
     * @param res es el una array de la cual se genera el conjunto de datos.
     * @param tipo es el mensje que aprece en la leyenda en la gráfica.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de barras.
     */
    private static  CategoryDataset crearDataSet(ArrayList<ArrayList<String>> res, String tipo){

            DefaultCategoryDataset dataset=null;

            if(res.size()>0){

                dataset = new DefaultCategoryDataset();

                for (ArrayList<String> i : res)
                    dataset.addValue(Integer.parseInt(i.get(1)), tipo, i.get(0));

            }

            return dataset;

        }


    /**
     * @author José Ángel Carvajal Soto
     * @brief Crea un conjunto de datos para una gráfica de circunferencia.
     * @param res es el una array de la cual se genera el conjunto de datos.
     * @param generos indica si la gráfica es de pacientes por genero u otra.
     * @return null si el conjunto de datos es vacío en la BD, si no devuelve un un data set para gráfica de circunferencia.
     */
    private static  DefaultPieDataset createDataSetPie(ArrayList<ArrayList<String>> res, Boolean generos) {
     Integer total=0;

     DefaultPieDataset data = null;

     if(res.size()>0){

         data = new DefaultPieDataset();

         for (ArrayList<String> i : res)
             total+= Integer.parseInt(i.get(1));

         for (ArrayList<String> i : res)
             if(Double.parseDouble(i.get(1))!=0.0)
                 data.setValue((generos? parseadorGeneros(i.get(0)) : parseadorUsuarios(i.get(0))), (Double.parseDouble(i.get(1))/total)*100.0);

        }

        if(total.equals(0))
            return null;

        return data;
             
        }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Traduce una cadena de la enumeracion de generos ('m', 'f') a Hombres y Mujeres respectivamente.
     * @param str cadena a parsear.
     * @return cadena parseada.
     */
    private static String parseadorGeneros(String str){
               
        String ret="";
                
        if (str.equals("f"))
            ret="Mujeres";
        else  if (str.equals("m"))
            ret="Hombres";
        else
            ret=str;
        return ret;

    }

    /**
     * @author José Ángel Carvajal Soto
     * @brief Traduce una cadena de la enumeracion de tipos ('m', 'f', 't', 'g') a su valor respectivo.
     * @param str cadena a parsear.
     * @return cadena parseada.
     */
    private static String parseadorUsuarios(String str){

        String ret="";

        if (str.equals("m"))
            ret="Médicos";
        else  if (str.equals("g"))
            ret="Gestores";
        else  if (str.equals("f"))
            ret="Farmacéuticos";
        else  if (str.equals("t"))
            ret="Técnicos";
        else
            ret=str;

        return ret;
    }

}
